<?php

/**
 * Representa uma Acao que um perfil possui
 */
class Acao implements IObject {

    /**
     * @var MyDb
     */
    public $tMysqli;

    private $IDAcao;
    private $IDPerfil;
    private $StAcao;
    private $StDescricao;
    private $EnRestrito;

    private $ArControleAcao;

    public function __construct( $IDAcao, $IDPerfil, $StAcao, $StDescricao, $EnRestrito, &$tMysqli ) {
        $this->IDAcao = $IDAcao;
        $this->IDPerfil = $IDPerfil;
        $this->StAcao = $StAcao;
        $this->StDescricao = $StDescricao;
        $this->EnRestrito = $EnRestrito;
        $this->tMysqli = $tMysqli;
    }

    public function loadPermissionControl() {
        $StSql = TQuery::getSqlPermissionControlLoad($this->IDAcao, $this->IDPerfil);
        $tQuery = $this->tMysqli->exec($StSql);
        while($ArPermissionControlData = mysqli_fetch_assoc($tQuery)) {
            $this->ArControleAcao[] = new ControleAcao($ArPermissionControlData, $this->tMysqli);
        }
    }

    public function hasDescription() {
        return !empty($this->StDescricao);
    }

    public function allows(ControleAcao $RequiredAccessControl) {
        if( !$this->ArControleAcao ) { return false; }
        foreach( $this->ArControleAcao as $AccessControl ) {
            if( $this->accessControlAllowsRequiredAccessControl($AccessControl, $RequiredAccessControl) ) {
                return true;
            }
        }
        return false;
    }

    private function accessControlAllowsRequiredAccessControl($AccessControl, $RequiredAccessControl) {
        if( !$AccessControl->equals($RequiredAccessControl) ) {
            return false;
        }

        $ArRestrictParam = $AccessControl->getRestrictParams();

        if( empty($ArRestrictParam) || $ArRestrictParam['Value'] == 'ALL' ) {
            return true;
        }

        return $this->allowAccessControlByParams($AccessControl, $RequiredAccessControl);
    }

    public function allowAccessControlByParams($AccessControl, $RequiredAccessControl) {
        $ArParams = $RequiredAccessControl->getStParam();
        $ArRestrictParam = $AccessControl->getRestrictParams();

        if( $AccessControl->isFilter() ) {
            return $ArRestrictParam['Value'] == $ArParams[0]['Value'];
        }

        $User = Dracosys::getLoggedUser();

        if( $ArRestrictParam['Restriction'] == 'pagamento' ) {
            return $User->hasPayment($ArParams[0]['Value']);
        }

        $ArIds = array(
            'usuario' => $User->getIDUsuario(),
            'setor' => $User->getTDepartamento()->getSetores(true)->getIDSetor(),
            'departamento' => $User->getTDepartamento()->getIDDepartamento()
        );

        return $ArIds[ $ArRestrictParam['Restriction'] ] == $ArParams[0]['Value'];
    }

    public function getIDAcao() {
        return $this->IDAcao;
    }

    public function setIDAcao($IDAcao) {
        $this->IDAcao = $IDAcao;
    }

    public function getIDPerfil() {
        return $this->IDPerfil;
    }

    public function setIDPerfil($IDPerfil) {
        $this->IDPerfil = $IDPerfil;
    }

    public function getStAcao() {
        return $this->StAcao;
    }

    public function setStAcao($StAcao) {
        $this->StAcao = $StAcao;
    }

    public function getStDescricao() {
        return $this->StDescricao;
    }

    public function setStDescricao($StDescricao) {
        $this->StDescricao = $StDescricao;
    }

    public function getArControleAcao() {
        return $this->ArControleAcao;
    }

    public function setArControleAcao($ArControleAcao) {
        $this->ArControleAcao = $ArControleAcao;
    }

    public function equals(IObject $Acao) {
        return ($this->IDAcao == $Acao->getIDAcao());
    }

}

?>
